let initAndroidBridge = false; //安卓是否初始化JsBridge

/**
 * Native相关工具类
 * 注意：PC端也可以打开电话和邮箱应用。
 */
export default {
  /**********************调用Native的基础功能**********************/

  /**
   * JS方式:打电话
   * DOM方式:<a href="tel:13764567708">给13764567708打电话</a>
   * @param number 电话号码
   */
  tel(number) {
    let url = 'tel:' + number;
    window.location.href = url;
  },
  /**
   * JS方式:发短信
   * DOM方式: <a href="sms:10086?body=000000">给10086发短信</a>
   * @param number 电话号码
   * @param body 短信内容,短信支持url链接,比如:body='访问http://www.hao123.com'
   */
  sms(number, body = '') {
    let url = 'sms:' + number + '?body=' + body;
    window.location.href = url;
  },
  /**
   * JS方式:发邮件
   * DMO方式:<a href="mailto:123456@qq.com?subject=Test&body=000000">给123456@qq.com发邮件</a>
   * @param number 电话号码
   * @param subject 邮件主题
   * @param body 邮件内容
   */
  mail({number, subject = '', body = ''}) {
    let url = 'mailto:' + number + '?subject=' + subject + '&body=' + body;
    window.location.href = url;
  },
  /**
   * JS方式:打开微信
   * DMO方式:<a href="weiXin://">打开微信</a>
   * 需要先检查微信是否安装,否则肯导致崩溃
   */
  weiXin() {
    window.location.href = 'weiXin://';
  },

  /**********************Native的屏幕适配**********************/
  /**
   * 获取系统类型
   * @returns {number} 系统类型：0是PC浏览器，1是android浏览器，2是ios浏览器，3是微信环境
   */
  getSystem() {
    let type = 0;
    let agent = navigator.userAgent.toLowerCase();
    if (agent.match(/MicroMessenger/i)) {
      type = 3;
    } else if (agent.match('android')) {
      type = 1;
    } else if (agent.match(/(iphone|ipod|ipad);?/i)) {
      type = 2;
    }
    return type;
  },
  /**
   * 适配native输入框，解决android和ios输入时，键盘显示异常的bug
   */
  adapterInput() {
    let type = this.getSystem();
    if (type === 1) {
      //监听事件：窗口或框架被重新调整大小。用于解决android键盘遮挡输入框的bug
      window.addEventListener('resize', () => {
        if (document.activeElement.tagName === 'INPUT' || document.activeElement.tagName === 'TEXTAREA') {
          window.setTimeout(() => {
            document.activeElement.scrollIntoViewIfNeeded();
          }, 0);
        }
      });
    } else if (type === 2) {
      //监听事件：键盘收起。用于解决ios键盘落下页面不下来的bug。
      document.body.addEventListener('focusout', () => {
        window.scroll(0, 0);
      });
    }
  },
  /**
   * 解决滑动穿透的问题
   * @param show 是否显示蒙层
   */
  initScrollPenetrate(show) {
    document.documentElement.style.overflow = show ? 'hidden' : 'auto';
    document.documentElement.style.height = show ? '200px' : 'auto';
    document.body.style.overflow = show ? 'hidden' : 'auto';
    document.body.style.height = show ? '200px' : 'auto';
  },

  /**********************调用JsBridge**********************/

  /**
   * 初始化JsBridge：用于调Native的方法
   * 初始化成功后，会将JsBridge保存到wiindow.FH5JsBridge
   */
  initJsBridge() {
    let ua = navigator.userAgent.toLowerCase();
    let isiOS = ua.match(/(iphone|ipod|ipad);?/i);
    let isAndroid = ua.match('android');

    if (window.FH5JsBridge) {
      return Promise.resolve();
    } else {
      return new Promise((resolve, reject) => {
        if (isAndroid) {
          document.addEventListener(
            'JsBridgeReady',
            function () {
              if (!initAndroidBridge) {
                initAndroidBridge = true;
                window.FH5JsBridge.initBridge(() => null);
              }
              resolve();
            },
            false
          );
        } else if (isiOS) {
          let JSBFrame = document.createElement('iframe');
          JSBFrame.style.display = 'none';
          JSBFrame.src = 'fh5jsbridge://__BRIDGE_LOADED__';
          document.documentElement.appendChild(JSBFrame);
          let hasChild = true;
          //定时器，用来监听JSBridge是否初始化完成
          let intervalId = setInterval(function () {
            if (hasChild) {
              document.documentElement.removeChild(JSBFrame);
              hasChild = false;
            }
            if (window.FH5JsBridge) {
              clearInterval(intervalId);
              resolve();
            }
          }, 50);
        }
      });
    }
  },

  /**
   * 调用Native的方法
   * @param name 方法名
   * @param data 方法入参
   */
  callMethod(name, data) {
    return this.initJsBridge().then(() => {
      return new Promise((resolve, reject) => {
        //回调函数
        let callback = (result = {}) => {
          let {code, msg, data} = result;
          if (code === 200) {
            resolve(data);
          } else {
            reject(msg);
          }
        };
        window.FH5JsBridge.callHandler(name, data, callback);
      });
    });
  },
  /**
   * 注册给Native调用的方法
   * 注意：registerMethod函数需要在callMethod之前调用。
   * @param name 方法名
   * @param method 给Native调用的方法
   */
  registerMethod(name, method) {
    return this.initJsBridge().then((result) => {
      /**
       * Native调用H5的方法
       * @param data  Native传入的参数
       * @param callback Native需要执行的回调
       */
      let action = (data, callback = () => null) => {
        //调用H5的方法
        let result = method(data);
        //将结果回传给Native
        callback(result);
      };
      window.FH5JsBridge.registerHandler(name, action);
    });
  }
};
